ICE(Interactive Connectivity Establishment,互動式連接建立)是用於 Offer/Answer 模式下的 NAT 穿越的技術,主要用於在UDP協議下建立多媒體會話。在實際的網路當中,有很多原因會導致簡單的從 A 端到 B 端直連不能如願完成。這需要繞過阻止建立連接的防火牆,給你的設備分配一個唯一可見的地址,如果路由器不允許主機直連,還得通過一台伺服器轉發數據。ICE 通過使用 STUN、TURN、NAT、SDP 技術完成上述工作。
ICE 建立連線的過程:
ICE 在所有的候選地址中,選擇開銷最小的路由。
當我們的客戶端位於 NAT 的內網中雖然可以與外網連線,但我們並不知道外網的 IP 位置,這個時候就需要通過 STUN 來取得外網 IP 位置。
STUN(Session Traversal Utilities for NAT,NAT 對談穿越應用程式)是一種網路協定,它允許位於NAT(或多重NAT)後的客戶端找出自己的公網位址,查出自己位於哪種類型的NAT之後以及NAT為某一個本地埠所繫結的Internet端埠。這些資訊被用來在兩個同時處於NAT路由器之後的主機之間建立UDP通信。該協定由RFC 5389定義。
從上一篇的 NAT 分類,以及上面對 STUN 的理解,我們知道在 Symmetric NAT 的網路環境中,是無法使用點對點 (Peer-to-Peer; P2P) 的方式來穿透 NAT,在這種情況下我們就需要 TURN(Traversal Using Relay NAT)來轉發封包。
不過這種方式雖然可以穿透防火牆,但卻沒有了原先 P2P 的優勢,而是變成了 Client-Server 的模式,因此 TURN Server 必須滿足非常高的頻寬要求,尤其是在多個並行連線的情況下。因此,使用 TURN Server 的成本很高,只有在沒有其他傳輸選項時才會選擇這個解決方案。
本篇了解 ICE、STUN、TURN 的基本運作,ICE 實際運作更複雜,不過我們先理解這些就可以了,我們也不需要自己去實現一個 ICE server,後面實作會使用開源的框架 。
https://zh.wikipedia.org/wiki/STUN
https://developer.mozilla.org/en-US/docs/Web/API/WebRTC_API/Protocols
http://www.cs.nccu.edu.tw/~lien/Writing/NGN/firewall.htm